<?php
/**
 * Klasa wspierająca obsługę obiektów DAO poprzez implementację fabryki obiektów, 
 * która przechowuje utworzone instancje, co ogranicza ilość tworzonych obiektów. 
 *
 */
class My_Db
{
	/**
	 * Zmienne odpowiedzialne za przechowywanie obiektów DAO
	 */
	private static $_oDaos = array();
	private static $_iUtworzone = 0;
	private static $_iWykorzystane = 0;
	
	
    /**
     * Sprawdza, czy aktualnie trwa jakaś transakcja. Jeśli tak, to nie pozwoli
     * na rozpoczęcie kolejnej.
     */
    protected static $_iIdTransakcji;

    
    /*
     * Fabryka obiektów - zwraca obiekty DAO
     */
	public static function factory( $sNazwaKlasy )
	{
		self::$_iWykorzystane++;
		
		// Jeśli utworzono już obiekt - zwróć go. Jeśli nie - utwórz i zwróć.
		if( isset( self::$_oDaos[$sNazwaKlasy] ) && ( self::$_oDaos[$sNazwaKlasy] instanceof My_Db_Table ) )
		{
			return self::$_oDaos[$sNazwaKlasy]; 	
		}
		else
		{
			self::$_oDaos[$sNazwaKlasy] = new $sNazwaKlasy();
			self::$_iUtworzone++;
			return self::$_oDaos[$sNazwaKlasy]; 
		}
	}
	
	/*
	 * Usuwa wybrany obiekt DAO
	 */
	public static function usun( $sNazwaKlasy )
	{
		unset( self::$_oDaos[$sNazwaKlasy] );
		return true;
	}

	
	/**
     * Metoda rozpoczynająca transakcję.
     *
     * @return Bool
     */
    public static function rozpocznijTransakcje()
    {
        if ( !self::$_iIdTransakcji )
        {
            Zend_Registry::get( 'db' )->beginTransaction();
            self::$_iIdTransakcji = rand(1000000, 9999999) . rand(1000000, 9999999) . rand(1000000, 9999999);

            return self::$_iIdTransakcji;
        }

        // Jeśli transakcja już istnieje, to ni zwracaj ID
        return null;
    }


    /**
     * Metoda kończy transakcję commitem.
     *
     * @return Bool
     */
    public static function zatwierdzTransakcje( $iIdTransakcji )
    {
        // Gdy dane 'zamknięcie' transakcji odpowiada rozpoczęciu, które się nie wykonało (w bazie)
        if( is_null($iIdTransakcji) ) return true;

        if( $iIdTransakcji == self::$_iIdTransakcji )
        {
            Zend_Registry::get( 'db' )->commit();
            self::$_iIdTransakcji = null;
        }

        return true;
    }


    /**
     * Metoda odwołuje transakcję.
     *
     * @return Bool
     */
    public static function odwolajTransakcje( $iIdTransakcji )
    {
        if( $iIdTransakcji == self::$_iIdTransakcji )
        {
            Zend_Registry::get( 'db' )->rollback();
            self::$_iIdTransakcji = null;
        }
    }


    /**
     * Zwraca obiekt adaptera bazy danych
     */
    public static function pobierzAdapter()
    {
        return Zend_Registry::get( 'db' );
    }
}
?>